I decided to start asking some questions of the data given the
metrics defined earlier. I decided to look into the correlation between
pairs of metrics relative to a third:
Market Age
“How does the correlation between
days_to_market and
on_market_age change by route of
administration?”:
suppressWarnings(suppressMessages({
library(smart.data)
if (!"smrt_drugs" %in% .cache$keys()){
smrt.drug_obs_data <- smart.data$
new(x = .cache$get("drug_obs_data") |> print(), name = "drugs")$
taxonomy.rule(
term.map = if ("smrt_drug_taxonomy" %in% .cache$keys()){ .cache$get("smrt_drug_taxonomy") } else { data.table(term = "metrics", desc = "Metrics related to events and other descriptive statistics") }
, update = !("smrt_drug_taxonomy" %in% .cache$keys())
)$
cache_mgr(action = upd) |>
invisible();
.cache$set("smrt_drugs", smrt.drug_obs_data);
.cache$set("smrt_drug_taxonomy", smrt.drug_obs_data$smart.rules$for_usage);
} else {
invisible(smart.data$new(as.data.table(x = 1), "none"))
(\(x){
x$data <- .cache$get("drug_obs_data")
x$cache_mgr(action = upd)
.cache$set("smrt_drugs", x);
})(.cache$get("smrt_drugs"))
}
get.smart("drugs")$use(identifier, metrics, retain = c(route), subset = days_to_market >= 0) |>
# View()
setkey(route, alt_ndc, days_to_market, on_market_age) |>
split_f(~route) |>
map_dbl(\(x) x %$% cor(as.numeric(days_to_market), as.numeric(on_market_age))) |>
modify_if(is.na, \(x) 0) |>
(\(x){
x <- x[order(x)]
nm <- names(x)
z <- calc.zero_mean(x, as.zscore = TRUE, use.population = TRUE)
y <- ratio(x + abs(min(x)), type="pareto", decimals = 6)
.wh_scale <- 800 * c(1.2, .7)
plot_ly(
x = z
, y = y
, size = 5 * exp(x) + 10
, width = .wh_scale[1]
, height = .wh_scale[2]
, hoverinfo = "text"
, hovertext = sprintf(fmt ="<b>%s</b><br><b>Y:</b> %.2f%% of Total<br><b>Cor</b>(days_to_market, on_market_age): %.2f<br><b>Z-score</b>(X): %.2f", nm, y * 100, x, z)
, color = x
, stroke = I("black")
, type = "scatter", mode = "markers"
) |>
config(mathjax = "cdn", displayModeBar = FALSE) |>
layout(
xaxis = list(
title = list(
text = "Z-score<sub>X</sub>: X | Cor(m<sub>0</sub>, m<sub>1</sub>) ~ Route"
, font = list(size = 16, family = "Georgia"))
, gridcolor = "#FFFFFF"
)
, yaxis = list(
title = list(
text = "Cumulative Proportion (X)"
, font = list(size = 16, family = "Georgia"))
, gridcolor = "#FFFFFF"
)
, title = list(
text = sprintf("Correlation Coefficient (<span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span> vs. <span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span>) by Route of Administration", "days_to_market", "on_market_age")
, font = list(family = "Georgia"))
, plot_bgcolor = rgb(.8,.8,.8)
, margin = list(b = 30, t = 50)
)
})()
}))
Warning: `line.width` does not currently support multiple values.Warning: `line.width` does not currently support multiple values.
Days Absent from Market
“How does the correlation between days_to_market and
days_market_absent change by route of
administration?”:
get.smart("drugs")$use(identifier, metrics, retain = c(route), subset = days_to_market >= 0) |>
# View()
setkey(route, alt_ndc, days_market_absent, on_market_age) |>
split_f(~route) |>
map_dbl(\(x) x %$% suppressWarnings(cor(as.numeric(days_market_absent), as.numeric(on_market_age)))) |>
modify_if(is.na, \(x) 0) |>
(\(x){
x <- x[order(x)]
nm <- names(x)
z <- calc.zero_mean(x, as.zscore = TRUE, use.population = TRUE)
y <- ratio(x + abs(min(x)), type="pareto", decimals = 6)
.wh_scale <- 800 * c(1.2, .7)
plot_ly(
x = z
, y = y
, size = 5 * exp(x) + 10
, width = .wh_scale[1]
, height = .wh_scale[2]
, hoverinfo = "text"
, hovertext = sprintf(fmt ="<b>%s</b><br><b>Y:</b> %.2f%% of Total<br><b>Cor</b>(days_to_market, days_market_absent): %.2f<br><b>Z-score</b>(X): %.2f", nm, y * 100, x, z)
, color = x
, stroke = I("black")
, type = "scatter"
, mode = "markers"
) |>
config(mathjax = "cdn", displayModeBar = FALSE) |>
layout(
xaxis = list(
title = list(
text = "Z-score<sub>X</sub>: X | Cor(m<sub>0</sub>, m<sub>1</sub>) ~ Route"
, font = list(size = 16, family = "Georgia"))
, gridcolor = "#FFFFFF"
)
, yaxis = list(
title = list(
text = "Cumulative Proportion (X)"
, font = list(size = 16, family = "Georgia"))
, gridcolor = "#FFFFFF"
)
, title = list(
text = sprintf("Correlation Coefficient (<span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span> vs. <span style='text-emphasis-position:under; text-emphais: filled red double-circle; '>%s</span>) by Route of Administration", "days_to_market", "days_market_absent")
, font = list(family = "Georgia"))
, plot_bgcolor = rgb(.8,.8,.8)
, margin = list(b = 30, t = 50)
)
})()
Warning: `line.width` does not currently support multiple values.Warning: `line.width` does not currently support multiple values.
Market age relative to days to market shows more variability in
correlation distribution. This is not to make an claim of statistically
significant differentiation; however, it may be worth exploring whether
or not there are clusters of administration routes based on event
correlation. A future update may address this, but this is as deep of
exploration I’ll go for now.
LS0tDQp0aXRsZTogIlF1ZXN0aW9uIEk6IENvcnJlbGF0aW9uIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogbWFya2Rvd24uY3NzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY3NzOiBtYXJrZG93bi5jc3MNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCnBhcmFtczoNCiAgZGF0YV9kaXI6IGRhdGENCiAgY3Jhbl9saWJzOiAhciBjKCdwdXJycicsICdqc29ubGl0ZScsICdodHRyJywgJ3N1bW1hcnl0b29scycsICdtdW5zZWxsJywgJ2NhY2hlbScsICdTbWFydEVEQScsICdodG1sdG9vbHMnLCAnc2xpZGVyJywgJ3N0cmluZ2knLCAnbWFncml0dHInLCAncGxvdGx5JywgJ0RUJywgJ2RhdGEudGFibGUnLCAncGRmdG9vbHMnLCAnbHVicmlkYXRlJywgJ2Z1dHVyZScsICdmdXJycicsICdmdXR1cmUuY2FsbHInKQ0KICBnaXRfbGliczogIXIgcGFzdGUwKCdib29rLm9mLicsIGMoJ3V0aWxpdGllcycsICdmZWF0dXJlcycsICd3b3JrZmxvdycpKSB8PiBjKCdhcmNoaXRlY3QnLCAnc21hcnQuZGF0YScsICdldmVudC52ZWN0b3JzJykNCiAgcmVmcmVzaDogIXIgRkFMU0UNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgb3B0c19jaHVuayA9IGxpc3QoY2FjaGU9VFJVRSwgY2FjaGUubGF6eT1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQ0KICApDQoNCnNvdXJjZSgic2V0dXAuUiIsIGxvY2FsPVRSVUUpDQpgYGANCg0KYGBgez1qc30NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBhc3luYw0KICBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL21hdGhqYXgvMi43LjcvTWF0aEpheC5qcz9jb25maWc9VGVYLU1NTC1BTV9DSFRNTCI+DQo8L3NjcmlwdD4NCmBgYA0KDQojIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpJIGRlY2lkZWQgdG8gc3RhcnQgYXNraW5nIHNvbWUgcXVlc3Rpb25zIG9mIHRoZSBkYXRhIGdpdmVuIHRoZSBtZXRyaWNzIGRlZmluZWQgZWFybGllci4gIEkgZGVjaWRlZCB0byBsb29rIGludG8gdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gcGFpcnMgb2YgbWV0cmljcyByZWxhdGl2ZSB0byBhIHRoaXJkOg0KDQojIyBNYXJrZXQgQWdlIA0KDQoiSG93IGRvZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gKmBkYXlzX3RvX21hcmtldGAqIGFuZCAqYG9uX21hcmtldF9hZ2VgKiBjaGFuZ2UgYnkgcm91dGUgb2YgYWRtaW5pc3RyYXRpb24/IjoNCg0KYGBge3IgTUVUUklDU19DT1JSRUxBVElPTl9JfSANCnN1cHByZXNzV2FybmluZ3Moc3VwcHJlc3NNZXNzYWdlcyh7DQpsaWJyYXJ5KHNtYXJ0LmRhdGEpDQoNCmlmICghInNtcnRfZHJ1Z3MiICVpbiUgLmNhY2hlJGtleXMoKSl7DQogIHNtcnQuZHJ1Z19vYnNfZGF0YSA8LSBzbWFydC5kYXRhJA0KICAgIG5ldyh4ID0gLmNhY2hlJGdldCgiZHJ1Z19vYnNfZGF0YSIpIHw+IHByaW50KCksIG5hbWUgPSAiZHJ1Z3MiKSQNCiAgICB0YXhvbm9teS5ydWxlKA0KICAgICAgdGVybS5tYXAgPSBpZiAoInNtcnRfZHJ1Z190YXhvbm9teSIgJWluJSAuY2FjaGUka2V5cygpKXsgLmNhY2hlJGdldCgic21ydF9kcnVnX3RheG9ub215IikgfSBlbHNlIHsgZGF0YS50YWJsZSh0ZXJtID0gIm1ldHJpY3MiLCBkZXNjID0gIk1ldHJpY3MgcmVsYXRlZCB0byBldmVudHMgYW5kIG90aGVyIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MiKSB9DQogICAgICAsIHVwZGF0ZSA9ICEoInNtcnRfZHJ1Z190YXhvbm9teSIgJWluJSAuY2FjaGUka2V5cygpKQ0KICAgICAgKSQNCiAgICBjYWNoZV9tZ3IoYWN0aW9uID0gdXBkKSB8Pg0KICAgIGludmlzaWJsZSgpOw0KICANCiAgLmNhY2hlJHNldCgic21ydF9kcnVncyIsIHNtcnQuZHJ1Z19vYnNfZGF0YSk7DQogIC5jYWNoZSRzZXQoInNtcnRfZHJ1Z190YXhvbm9teSIsIHNtcnQuZHJ1Z19vYnNfZGF0YSRzbWFydC5ydWxlcyRmb3JfdXNhZ2UpOw0KfSBlbHNlIHsgDQogIGludmlzaWJsZShzbWFydC5kYXRhJG5ldyhhcy5kYXRhLnRhYmxlKHggPSAxKSwgIm5vbmUiKSkNCiAgKFwoeCl7DQogICAgeCRkYXRhIDwtIC5jYWNoZSRnZXQoImRydWdfb2JzX2RhdGEiKQ0KICAgIHgkY2FjaGVfbWdyKGFjdGlvbiA9IHVwZCkNCiAgICAuY2FjaGUkc2V0KCJzbXJ0X2RydWdzIiwgeCk7DQogIH0pKC5jYWNoZSRnZXQoInNtcnRfZHJ1Z3MiKSkNCn0NCg0KZ2V0LnNtYXJ0KCJkcnVncyIpJHVzZShpZGVudGlmaWVyLCBtZXRyaWNzLCByZXRhaW4gPSBjKHJvdXRlKSwgc3Vic2V0ID0gZGF5c190b19tYXJrZXQgPj0gMCkgfD4gDQogICMgVmlldygpIA0KICBzZXRrZXkocm91dGUsIGFsdF9uZGMsIGRheXNfdG9fbWFya2V0LCBvbl9tYXJrZXRfYWdlKSB8Pg0KICBzcGxpdF9mKH5yb3V0ZSkgfD4NCiAgbWFwX2RibChcKHgpIHggJSQlIGNvcihhcy5udW1lcmljKGRheXNfdG9fbWFya2V0KSwgYXMubnVtZXJpYyhvbl9tYXJrZXRfYWdlKSkpIHw+DQogIG1vZGlmeV9pZihpcy5uYSwgXCh4KSAwKSB8PiANCiAgKFwoeCl7IA0KICAgIHggPC0geFtvcmRlcih4KV0NCiAgICBubSA8LSBuYW1lcyh4KQ0KICAgIHogPC0gY2FsYy56ZXJvX21lYW4oeCwgYXMuenNjb3JlID0gVFJVRSwgdXNlLnBvcHVsYXRpb24gPSBUUlVFKQ0KICAgIHkgPC0gcmF0aW8oeCArIGFicyhtaW4oeCkpLCB0eXBlPSJwYXJldG8iLCBkZWNpbWFscyA9IDYpDQogICAgDQogICAgLndoX3NjYWxlIDwtIDgwMCAqIGMoMS4yLCAuNykNCiAgICANCiAgICBwbG90X2x5KA0KICAgICAgeCA9IHoNCiAgICAgICwgeSA9IHkNCiAgICAgICwgc2l6ZSA9IDUgKiBleHAoeCkgKyAxMA0KICAgICAgLCB3aWR0aCA9IC53aF9zY2FsZVsxXQ0KICAgICAgLCBoZWlnaHQgPSAud2hfc2NhbGVbMl0NCiAgICAgICwgaG92ZXJpbmZvID0gInRleHQiDQogICAgICAsIGhvdmVydGV4dCA9IHNwcmludGYoZm10ID0iPGI+JXM8L2I+PGJyPjxiPlk6PC9iPiAlLjJmJSUgb2YgVG90YWw8YnI+PGI+Q29yPC9iPihkYXlzX3RvX21hcmtldCwgb25fbWFya2V0X2FnZSk6ICUuMmY8YnI+PGI+Wi1zY29yZTwvYj4oWCk6ICUuMmYiLCBubSwgeSAqIDEwMCwgeCwgeikNCiAgICAgICwgY29sb3IgPSB4DQogICAgICAsIHN0cm9rZSA9IEkoImJsYWNrIikNCiAgICAgICwgdHlwZSA9ICJzY2F0dGVyIiwgbW9kZSA9ICJtYXJrZXJzIg0KICAgICAgKSB8Pg0KICAgICAgY29uZmlnKG1hdGhqYXggPSAiY2RuIiwgZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgfD4NCiAgICAgIGxheW91dCgNCiAgICAgICAgeGF4aXMgPSBsaXN0KA0KICAgICAgICAgICAgdGl0bGUgPSBsaXN0KA0KICAgICAgICAgICAgICB0ZXh0ID0gIlotc2NvcmU8c3ViPlg8L3N1Yj46IFggfCBDb3IobTxzdWI+MDwvc3ViPiwgbTxzdWI+MTwvc3ViPikgfiBSb3V0ZSINCiAgICAgICAgICAgICAgLCBmb250ID0gbGlzdChzaXplID0gMTYsIGZhbWlseSA9ICJHZW9yZ2lhIikpDQogICAgICAgICAgICAsIGdyaWRjb2xvciA9ICIjRkZGRkZGIg0KICAgICAgICAgICAgKQ0KICAgICAgICAsIHlheGlzID0gbGlzdCgNCiAgICAgICAgICAgIHRpdGxlID0gbGlzdCgNCiAgICAgICAgICAgICAgdGV4dCA9ICJDdW11bGF0aXZlIFByb3BvcnRpb24gKFgpIg0KICAgICAgICAgICAgICAsIGZvbnQgPSBsaXN0KHNpemUgPSAxNiwgZmFtaWx5ID0gIkdlb3JnaWEiKSkNCiAgICAgICAgICAgICwgZ3JpZGNvbG9yID0gIiNGRkZGRkYiDQogICAgICAgICAgICApDQogICAgICAgICwgdGl0bGUgPSBsaXN0KA0KICAgICAgICAgICAgdGV4dCA9IHNwcmludGYoIkNvcnJlbGF0aW9uIENvZWZmaWNpZW50ICg8c3BhbiBzdHlsZT0ndGV4dC1lbXBoYXNpcy1wb3NpdGlvbjp1bmRlcjsgdGV4dC1lbXBoYWlzOiBmaWxsZWQgcmVkIGRvdWJsZS1jaXJjbGU7ICc+JXM8L3NwYW4+IHZzLiA8c3BhbiBzdHlsZT0ndGV4dC1lbXBoYXNpcy1wb3NpdGlvbjp1bmRlcjsgdGV4dC1lbXBoYWlzOiBmaWxsZWQgcmVkIGRvdWJsZS1jaXJjbGU7ICc+JXM8L3NwYW4+KSBieSBSb3V0ZSBvZiBBZG1pbmlzdHJhdGlvbiIsICJkYXlzX3RvX21hcmtldCIsICJvbl9tYXJrZXRfYWdlIikNCiAgICAgICAgICAgICwgZm9udCA9IGxpc3QoZmFtaWx5ID0gIkdlb3JnaWEiKSkNCiAgICAgICAgLCBwbG90X2JnY29sb3IgPSByZ2IoLjgsLjgsLjgpDQogICAgICAgICwgbWFyZ2luID0gbGlzdChiID0gMzAsIHQgPSA1MCkNCiAgICAgICAgKSANCiAgfSkoKQ0KfSkpDQpgYGANCg0KIyMgRGF5cyBBYnNlbnQgZnJvbSBNYXJrZXQgDQoNCioiSG93IGRvZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gYGRheXNfdG9fbWFya2V0YCBhbmQgYGRheXNfbWFya2V0X2Fic2VudGAgY2hhbmdlIGJ5IHJvdXRlIG9mIGFkbWluaXN0cmF0aW9uPyIqOg0KDQpgYGB7ciBNRVRSSUNTX0NPUlJFTEFUSU9OX0lJfSANCmdldC5zbWFydCgiZHJ1Z3MiKSR1c2UoaWRlbnRpZmllciwgbWV0cmljcywgcmV0YWluID0gYyhyb3V0ZSksIHN1YnNldCA9IGRheXNfdG9fbWFya2V0ID49IDApIHw+IA0KICAjIFZpZXcoKSANCiAgc2V0a2V5KHJvdXRlLCBhbHRfbmRjLCBkYXlzX21hcmtldF9hYnNlbnQsIG9uX21hcmtldF9hZ2UpIHw+DQogIHNwbGl0X2YofnJvdXRlKSB8Pg0KICBtYXBfZGJsKFwoeCkgeCAlJCUgc3VwcHJlc3NXYXJuaW5ncyhjb3IoYXMubnVtZXJpYyhkYXlzX21hcmtldF9hYnNlbnQpLCBhcy5udW1lcmljKG9uX21hcmtldF9hZ2UpKSkpIHw+DQogIG1vZGlmeV9pZihpcy5uYSwgXCh4KSAwKSB8PiANCiAgKFwoeCl7IA0KICAgIHggPC0geFtvcmRlcih4KV0NCiAgICBubSA8LSBuYW1lcyh4KQ0KICAgIHogPC0gY2FsYy56ZXJvX21lYW4oeCwgYXMuenNjb3JlID0gVFJVRSwgdXNlLnBvcHVsYXRpb24gPSBUUlVFKQ0KICAgIHkgPC0gcmF0aW8oeCArIGFicyhtaW4oeCkpLCB0eXBlPSJwYXJldG8iLCBkZWNpbWFscyA9IDYpDQogICAgDQogICAgLndoX3NjYWxlIDwtIDgwMCAqIGMoMS4yLCAuNykNCiAgICANCiAgICBwbG90X2x5KA0KICAgICAgeCA9IHoNCiAgICAgICwgeSA9IHkNCiAgICAgICwgc2l6ZSA9IDUgKiBleHAoeCkgKyAxMA0KICAgICAgLCB3aWR0aCA9IC53aF9zY2FsZVsxXQ0KICAgICAgLCBoZWlnaHQgPSAud2hfc2NhbGVbMl0NCiAgICAgICwgaG92ZXJpbmZvID0gInRleHQiDQogICAgICAsIGhvdmVydGV4dCA9IHNwcmludGYoZm10ID0iPGI+JXM8L2I+PGJyPjxiPlk6PC9iPiAlLjJmJSUgb2YgVG90YWw8YnI+PGI+Q29yPC9iPihkYXlzX3RvX21hcmtldCwgZGF5c19tYXJrZXRfYWJzZW50KTogJS4yZjxicj48Yj5aLXNjb3JlPC9iPihYKTogJS4yZiIsIG5tLCB5ICogMTAwLCB4LCB6KQ0KICAgICAgLCBjb2xvciA9IHgNCiAgICAgICwgc3Ryb2tlID0gSSgiYmxhY2siKQ0KICAgICAgLCB0eXBlID0gInNjYXR0ZXIiDQogICAgICAsIG1vZGUgPSAibWFya2VycyINCiAgICAgICkgfD4NCiAgICAgIGNvbmZpZyhtYXRoamF4ID0gImNkbiIsIGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpIHw+DQogICAgICBsYXlvdXQoDQogICAgICAgIHhheGlzID0gbGlzdCgNCiAgICAgICAgICAgIHRpdGxlID0gbGlzdCgNCiAgICAgICAgICAgICAgdGV4dCA9ICJaLXNjb3JlPHN1Yj5YPC9zdWI+OiBYIHwgQ29yKG08c3ViPjA8L3N1Yj4sIG08c3ViPjE8L3N1Yj4pIH4gUm91dGUiDQogICAgICAgICAgICAgICwgZm9udCA9IGxpc3Qoc2l6ZSA9IDE2LCBmYW1pbHkgPSAiR2VvcmdpYSIpKQ0KICAgICAgICAgICAgLCBncmlkY29sb3IgPSAiI0ZGRkZGRiINCiAgICAgICAgICAgICkNCiAgICAgICAgLCB5YXhpcyA9IGxpc3QoDQogICAgICAgICAgICB0aXRsZSA9IGxpc3QoDQogICAgICAgICAgICAgIHRleHQgPSAiQ3VtdWxhdGl2ZSBQcm9wb3J0aW9uIChYKSINCiAgICAgICAgICAgICAgLCBmb250ID0gbGlzdChzaXplID0gMTYsIGZhbWlseSA9ICJHZW9yZ2lhIikpDQogICAgICAgICAgICAsIGdyaWRjb2xvciA9ICIjRkZGRkZGIg0KICAgICAgICAgICAgKQ0KICAgICAgICAsIHRpdGxlID0gbGlzdCgNCiAgICAgICAgICAgIHRleHQgPSBzcHJpbnRmKCJDb3JyZWxhdGlvbiBDb2VmZmljaWVudCAoPHNwYW4gc3R5bGU9J3RleHQtZW1waGFzaXMtcG9zaXRpb246dW5kZXI7IHRleHQtZW1waGFpczogZmlsbGVkIHJlZCBkb3VibGUtY2lyY2xlOyAnPiVzPC9zcGFuPiB2cy4gPHNwYW4gc3R5bGU9J3RleHQtZW1waGFzaXMtcG9zaXRpb246dW5kZXI7IHRleHQtZW1waGFpczogZmlsbGVkIHJlZCBkb3VibGUtY2lyY2xlOyAnPiVzPC9zcGFuPikgYnkgUm91dGUgb2YgQWRtaW5pc3RyYXRpb24iLCAiZGF5c190b19tYXJrZXQiLCAiZGF5c19tYXJrZXRfYWJzZW50IikNCiAgICAgICAgICAgICwgZm9udCA9IGxpc3QoZmFtaWx5ID0gIkdlb3JnaWEiKSkNCiAgICAgICAgLCBwbG90X2JnY29sb3IgPSByZ2IoLjgsLjgsLjgpDQogICAgICAgICwgbWFyZ2luID0gbGlzdChiID0gMzAsIHQgPSA1MCkNCiAgICAgICAgKSANCn0pKCkNCg0KYGBgDQoNCjwvZGl2Pg0KTWFya2V0IGFnZSByZWxhdGl2ZSB0byBkYXlzIHRvIG1hcmtldCBzaG93cyBtb3JlIHZhcmlhYmlsaXR5IGluIGNvcnJlbGF0aW9uIGRpc3RyaWJ1dGlvbi4gIFRoaXMgaXMgbm90IHRvIG1ha2UgYW4gY2xhaW0gb2Ygc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbnRpYXRpb247IGhvd2V2ZXIsIGl0IG1heSBiZSB3b3J0aCBleHBsb3Jpbmcgd2hldGhlciBvciBub3QgdGhlcmUgYXJlIGNsdXN0ZXJzIG9mIGFkbWluaXN0cmF0aW9uIHJvdXRlcyBiYXNlZCBvbiBldmVudCBjb3JyZWxhdGlvbi4gIEEgZnV0dXJlIHVwZGF0ZSBtYXkgYWRkcmVzcyB0aGlzLCBidXQgdGhpcyBpcyBhcyBkZWVwIG9mIGV4cGxvcmF0aW9uIEknbGwgZ28gZm9yIG5vdy4NCjxicj4NCjxicj4NCjxkaXY+DQoNCg==